1 Introduction

1.1 Problématique

Prédire les résultats d’éléctions présidentielles française d’un bureau de vote, dans l’idéal. Mais en réalité le but était surtout de trouver des correlations et dépendances entre les résultats d’éléctions présidentielles française d’un bureau de vote, et des données démographiques.

1.2 Cadre théorique

Les préférences politiques des individus peuvent être façonnées par des variables socio-démographiques telles que l’âge, le niveau d’éducation, la situation économique ou encore le lieu de résidence. Nous voulions essayer d’observer des tendances que créent ces cadres théoriques. Plusieurs cadres théoriques permettent de formuler des hypothèses sur ces influences potentielles :

La théorie de la socialisation politique suppose que des facteurs comme l’âge, le genre et la composition familiale jouent un rôle dans la formation des opinions politiques. Par exemple, on pourrait s’attendre à ce que les jeunes adultes soient plus attirés par des idées progressistes, tandis que les générations plus âgées privilégient des positions conservatrices, influencées par leurs expériences passées.

Les théories liées au clivage de classe sociale, inspirées par les travaux de Karl Marx et Pierre Bourdieu, postulent que la position des individus dans la hiérarchie socio-professionnelle peut orienter leurs préférences politiques. Les individus occupant des emplois manuels ou précaires pourraient être davantage sensibles aux discours en faveur de la justice sociale, tandis que les catégories socio-professionnelles supérieures seraient plus réceptives aux politiques favorisant l’investissement et la stabilité économique.

Le capital culturel, tel que défini par Pierre Bourdieu, pourrait également jouer un rôle dans le comportement électoral. Les niveaux de qualification peuvent influencer la perception des enjeux politiques : les personnes disposant d’un diplôme supérieur pourraient privilégier des valeurs universalistes et libérales, alors que les moins diplômés pourraient être plus sensibles aux discours protectionnistes ou nationalistes.

La théorie du contexte géographique met en avant l’importance du lieu de vie et des interactions sociales locales sur les comportements politiques. Les caractéristiques urbaines et rurales, la proportion de logements sociaux ou encore l’ancienneté des constructions peuvent être des indicateurs pertinents pour comprendre les dynamiques électorales locales.

La théorie de la privation relative suggère que les inégalités perçues entre les attentes des individus et leur situation réelle peuvent les amener à soutenir des mouvements politiques contestataires. Des indicateurs comme le taux de pauvreté, le niveau de vie ou la précarité de l’emploi pourraient refléter ce sentiment de frustration.

Enfin, la théorie du choix rationnel propose que les électeurs adoptent des comportements stratégiques, en cherchant à maximiser leurs bénéfices individuels à travers leurs choix politiques. Par exemple, les propriétaires immobiliers ou les ménages vivant seuls pourraient orienter leurs votes en fonction des politiques perçues comme avantageuses ou défavorables à leurs intérêts.

1.3 Modèle de l’étude

Quel lien existe entre les différents facteurs socio-démographiques et influencent-ils les choix politiques des citoyens ?

1.4 Objectifs de l’étude

L’objectif est d’explorer ces hypothèses théoriques en s’appuyant sur des données socio-démographiques et électorales de plusieurs années. Cette étape théorique permet de poser les bases d’une analyse empirique qui pourra confirmer ou infirmer ces hypothèses en fonction des observations. Nous étudierons les liens au travers de différentes techniques d’analyse statistiques.

1.5 Livrable

L’application sous forme d’une carte interactive, ainsi que des diagrammes de notre étude, est accessible via l’URL : https://cyrildeschamps.fr


2 Identification et récupération des données

2.1 Élections par bureau de vote

D’après le cadre théorique, la première étape consiste à collecter les résultats des élections présidentielles. Pour enrichir notre jeu de données, nous avons choisi de les détailler au niveau des bureaux de vote. La plateforme data.gouv.fr nous donne accès à ce type de données. Lors de chaque élection, environ 70 000 bureaux de vote partagent leurs résultats. Nous limiterons toutefois notre étude aux trois dernières élections présidentielles (2012, 2017 et 2022), ce qui sera largement suffisant pour répondre à notre problématique.

De plus, nous nous concentrerons uniquement sur les bureaux de vote situés en France métropolitaine afin de simplifier la visualisation des données sur une carte. Cette restriction n’a qu’un faible impact sur la représentativité globale du jeu de données.

Enfin, nous n’utiliserons que les données des premiers tours. Elles sont plus représentatives du choix de chacun, car non-influencé par l’obligation de voter pour le “moins pire”.

2.2 Données socio-démographiques

À partir du cadre théorique, nous avons identifié plusieurs groupes de facteurs socio-démographiques susceptibles d’influencer les orientations politiques des individus :

  • Facteurs démographique : ce groupe comprend des variables telles que l’âge, le genre et la composition familiale. Ces éléments permettent d’évaluer l’impact de la socialisation politique, notamment l’influence des générations et des expériences de vie sur le comportement électoral.

  • Facteurs travail et revenus : ces variables incluent la catégorie socio-professionnelle, le type d’emploi (salarié ou indépendant), le taux d’activité et le niveau de vie. Elles permettent d’explorer le rôle des disparités économiques et de la hiérarchie sociale sur les préférences politiques, en lien avec la théorie du clivage de classe.

  • Facteurs éducation : le niveau de diplôme et les qualifications constituent des indicateurs clés du capital culturel. Ces données sont utiles pour comprendre la manière dont l’accès au savoir et la formation influencent la perception des enjeux politiques.

  • Facteurs lieu de vie : ce groupe comprend des variables liées au lieu de résidence, telles que la répartition urbaine ou rurale, la proportion de logements sociaux, et l’ancienneté des constructions. Ces éléments permettent d’examiner l’impact du contexte spatial et des interactions sociales locales sur le vote.

  • Facteurs conditions de vie : le taux de pauvreté, la précarité de l’emploi et la composition des ménages permettent de mesurer le sentiment de privation relative et son effet potentiel sur l’adhésion à des mouvements politiques contestataires.

  • Facteurs mode de vie : certaines variables, comme la propriété immobilière ou la structure des ménages (par exemple, vivre seul ou en famille), peuvent refléter des comportements électoraux stratégiques, en lien avec des choix rationnels visant à préserver ou à optimiser une situation personnelle.

Certaines de ces données ont été directement récupérées sur le site de l’INSEE, via des études ou des cartes interactives avec export de données (par exemple, statistiques-locales.insee.fr). Nous avons rencontré des difficultés pour obtenir des données complètes et précises, par exemple pour l’âge moyen des habitants. En effet, la donnée était séparée en tranches d’âge, ce qui ne correspondait pas exactement à notre besoin. De plus, ces tranches d’age étaient réduites à moins de 25 ans, 25-64 ans et plus de 65 ans. Nous avons donc dû nous contenter de ces données, en espérant qu’elles soient suffisantes pour notre étude.

Nous avons aussi rencontré des problèmes pour obtenir des données sur le niveau d’études, qui n’étaient pas disponibles pour toutes les années. Pour ces paramètres, nous avons choisi des laisser ces valeurs manquantes plutôt que de les calculer avec des valeurs approximatives. Cela nous permet de conserver une certaine rigueur dans notre analyse, nous laissant toujours la possibilité de revenir sur ce choix et d’imputer les données si besoin.

Les données socio-démographiques concernant les communes d’outre-mer n’ont pas été incluses dans notre étude, car il manquait trop de données pour être comparables avec celles de la France métropolitaine. Cela aurait introduit un biais dans notre analyse, en mélangeant des données provenant de contextes socio-économiques différents.

La grande majorité de ces données étant regroupées par commune, nous avons décidé de les répartir proportionnellement entre les bureaux de vote en fonction du nombre de votants.

Nous avons aussi voulu utiliser d’autres données, ou des jeux plus précis pour notre analyse, mais ces données étaient rapportés aux départements ou région et non par commune. Cela aurait nécessité un travail de fusion et de répartition des données plus complexe, que nous n’avons pas jugé utile pour notre étude.

En revanche, la collecte des données concernant les revenus, le lieu de vie et les conditions de vie a été plus complexe. Ces données sont fournies sous forme de « carreaux » géographiques de 200 mètres de côté. Il a donc été nécessaire de récupérer les contours géographiques des bureaux de vote, de convertir et harmoniser les formats de coordonnées (CRS), puis de fusionner ces ensembles de données. La librairie R sf a été utilisée pour effectuer ces opérations, notamment en croisant les carreaux de 200 mètres avec les contours des bureaux de vote. Cette tâche s’est avérée chronophage en raison du coût élevé des calculs nécessaires pour chaque opération. Certaines données ont dû être additionnées, d’autres moyennées. Une vérification finale a montré une perte de seulement 0,01 % des données, ce qui constitue un excellent résultat pour ce type de fusion géographique.


3 Nettoyage et fusion des données

Concernant le nettoyage des données, plusieurs étapes ont été nécessaires pour garantir la qualité et la cohérence des informations. Les données électorales et socio-démographiques ont été collectées auprès de différentes sources, nécessitant une harmonisation des formats et des variables. Nous avons d’abord sélectionné les colonnes pertinentes pour notre étude, en éliminant les doublons et les variables inutiles. Un travail de normalisation a été effectué pour uniformiser les noms des colonnes et faciliter les opérations de fusion et de jointure. Les données ont été vérifiées afin d’éviter les valeurs aberrantes et garantir leur cohérence. Certaines transformations ont également été effectuées pour faciliter la visualisation et les rendre compatibles avec notre modèle d’analyse.

Le point de centralisation des données finales est le code bureau de vote, un identifiant unique attribué à chaque bureau de vote.

3.1 Traitement des données électorales

Pour les résultats des élections, il a d’abord été nécessaire de transformer la liste des votes par candidat dans chaque bureau de vote en catégories agrégées correspondant aux principaux courants politiques : Extrême Gauche, Gauche, Centre, Droite et Extrême Droite. Cette étape permet de simplifier l’analyse des tendances politiques tout en conservant une granularité suffisante.

Une colonne “Code” a été ajoutée en combinant les codes du département, de la commune et du bureau de vote, ce qui facilite la fusion avec d’autres jeux de données. Certaines colonnes, telles que les noms des départements ou les pourcentages inutiles (ex. : % Abstentions/Inscrits), ont été supprimées pour alléger le jeu de données. Une colonne “nonExp” a été créée pour regrouper les bulletins blancs et nuls. Cette information nous aide à mieux comprendre les niveaux de participation et de contestation.

Les données finales ont été organisées de manière à regrouper les colonnes liées à chaque courant politique, en mettant en avant les variables principales (comme les pourcentages par votant, inscrits et suffrages exprimés).

Un extrait des données nettoyées et organisées est présenté ci-dessous :

Annee Code Libellé de la commune Votants nonExp VoixEG % Voix/VotantEG VoixG % Voix/VotantG VoixC % Voix/VotantC VoixD % Voix/VotantD VoixED % Voix/VotantED
2022 010010001 L'Abergement-Clémenciat 537 17 6 1.117318 107 19.92551 168 31.28492 47 8.752328 192 35.75419
2022 010020001 L'Abergement-de-Varey 175 4 5 2.857143 61 34.85714 60 34.28571 8 4.571429 37 21.14286
2022 010040001 Ambérieu-en-Bugey 863 23 12 1.390498 286 33.14021 183 21.20510 53 6.141367 306 35.45771

3.2 Traitement des données socio-démographiques

Concernant les facteurs socio-démographiques, certaines données étaient déjà disponibles au niveau des bureaux de vote, tandis que d’autres étaient regroupées au niveau communal. Ces dernières ont été réparties entre les bureaux de vote en suivant une répartition proportionnelle basée sur le nombre de votants, comme décrit précédemment. Les données ont ensuite été allégé et les colonnes renommés pour améliorer la lisibilité globale des données. Les colonnes inutiles ont été supprimé, pour éviter de garder des informations superflues.

Afin de préparer la visualisation de nos données sur des cartes, nous avons conservé un fichier spatial au format GeoJSON contenant les contours des bureaux de vote, identifiés par l’ID code_bureau_vote. Ce fichier, d’une taille de 600 Mo, a été isolé pour éviter de ralentir le traitement des données lors des analyses statistiques. En cas de besoin, il peut être facilement fusionné avec notre jeu de données pour générer des visualisations cartographiques. Le script est accessible en annexe.

Ces étapes ont permis de disposer d’un jeu de données homogène et prêt pour l’analyse statistique des corrélations entre les variables socio-démographiques et les résultats électoraux. Voici un échantillon des 72 colonnes finales :

code_bureau_vote votants non_exp voix_eg pourcentage_voix_votant_eg voix_g pourcentage_voix_votant_g voix_c pourcentage_voix_votant_c voix_d pourcentage_voix_votant_d voix_ed pourcentage_voix_votant_ed code_insee population_ratio libelle nb_25 nb_25_64 nb_65 prop_25 prop_25_64 prop_65 taux_nat taux_mort nb_non_scolarises part_non_peu_diplomes part_bepc_brevet part_cap_bep part_bac nb_h_total nb_f_total nb_h_15_24 nb_h_25_64 nb_h_65 nb_f_15_24 nb_f_25_64 nb_f_65 population_totale proportion_h proportion_f nb_emplois_lt taux_activite part_emplois_salaries part_agriculteurs part_emplois_non_salaries part_artisans part_commercants part_chefs_entreprise part_cadres part_prof_intermediaires part_employes part_ouvriers annees nb_menages nb_menages_pauvres nb_menages_seul nb_menages_5plus nb_menages_proprietaires nb_menages_monoparentaux niveau_vie_total surface_totale_logements nb_logements_collectifs nb_logements_maisons nb_log_avant_1945 nb_log_1945_1969 nb_log_1970_1989 nb_log_apres_1990 nb_log_date_inconnue nb_logements_sociaux part_bac2 part_bac3_4 part_bac5_plus
010010001 508 9 29 5.708661 125 24.6063 54 10.62992 165 32.48031 126 24.80315 01001 1.0000000 L'Abergement-Clémenciat 247.0000 409.000 128.0000 31.5 52.2 16.3 13.0 7.1 555.000 27.4 5.8 25.4 16.8 245.0000 231.0000 35.0000 163.0000 47.00000 32.000 148.0000 51.00000 476.000 0.515 0.485 73.0000 74.9 64.4 18.8 35.6 0.0 9.4 15.4 37.7 18.7 37.3 95.1 2008-2012 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
010020001 179 5 17 9.497207 49 27.3743 22 12.29050 48 26.81564 38 21.22905 01002 1.0000000 L'Abergement-de-Varey 59.0000 124.000 39.0000 26.5 56.0 17.5 18.6 11.4 169.000 15.6 3.4 22.3 18.4 72.0000 69.0000 7.0000 51.0000 14.00000 10.000 45.0000 13.00000 141.000 0.511 0.489 17.0000 78.5 44.4 51.5 55.6 0.0 0.0 48.5 0.0 0.0 61.1 92.2 2008-2012 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
010040001 800 19 118 14.750000 227 28.3750 74 9.25000 173 21.62500 189 23.62500 01004 0.1229445 Ambérieu-en-Bugey 589.2731 855.325 256.3393 34.6 50.3 15.1 14.2 7.6 1205.963 28.1 6.7 24.5 18.6 556.0781 532.1039 122.0839 350.6378 83.47933 110.773 333.9173 87.29061 1088.182 0.511 0.489 949.0088 74.4 90.6 0.1 9.4 5.5 11.2 26.9 33.0 23.4 55.2 90.3 2008-2012 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

4 Visualisation par la carte

Après avoir fusionné toutes les données issues des élections présidentielles de 2012, 2017 et 2022, nous avons construit des cartes géographiques illustrant l’évolution de l’intention de vote des Français au fil du temps. Ces cartes mettent en évidence les changements significatifs dans les orientations politiques de l’électorat, avec une représentation des zones dominées par les votes à droite (teintes bleues) et à gauche (teintes rouges).

En analysant les cartes de 2012, 2017 et 2022, nous pouvons observer un basculement marqué vers la droite dans de nombreuses régions, particulièrement dans le Nord-Est de la France. Toutefois, certaines régions, comme la Bretagne, conservent une stabilité de vote à gauche.

Cette transition dans les résultats électoraux nous invite à explorer plus en détail les facteurs sous-jacents à ces changements, notamment en cherchant des corrélations entre différentes variables socio-économiques et les tendances politiques observées.

Ces dernières sont disponibles directement sur https://helyn.cyrildeschamps.fr, elles sont interactives et des données sont accessibles en cliquant sur la commune de votre choix.


5 Data Mining Descriptif

L’analyse des données doit être la plus précise possible. Pour cela, nous avons choisi de créer un jeu de données intermédiaire qui élimine la duplication des bureaux de vote sur plusieurs années. Nous sélectionnerons aléatoirement une seule observation par bureau de vote parmi différentes années afin d’éviter un biais de similitude. En effet, un bureau ayant historiquement voté à droite a de fortes chances de continuer à voter de la même manière, ce qui pourrait fausser l’analyse si nous incluons plusieurs observations temporelles sans ajustement.

Nous ajoutons également une variable score comprise entre 0 et 1, qui indique l’orientation politique moyenne :
- 0 correspond à l’extrême gauche,
- 0.5 représente le centre,
- 1 correspond à l’extrême droite.

data <- data %>%
  mutate(
    score_orientation = round(
        (voix_ed * 1 + voix_d * 0.75 + voix_c * 0.5 + voix_g * 0.25 + voix_eg * 0) /
          (voix_eg + voix_g + voix_c + voix_d + voix_ed),
        2
      )
  ) %>%
  filter(!is.na(score_orientation))

score_moyen <- mean(data$score_orientation)

# Intervalle de confiance
n <- length(data$score_orientation)
score_var <- var(data$score_orientation)
alpha <- 0.05
quant_stud <- qt(1-alpha/2, df=n-1)
borne_inf <- score_moyen - quant_stud * sqrt(score_var/n)
borne_sup <- score_moyen + quant_stud * sqrt(score_var/n)
paste(borne_inf, "<", score_moyen, "<", borne_sup)
## [1] "0.58203329077629 < 0.582397657293831 < 0.582762023811372"

Cela indique que l’orientation politique française actuelle se situe plutôt au centre-droit.

Notre objectif initial est d’explorer la corrélation entre le niveau de richesse et l’orientation politique. Les politiques de droite étant souvent perçues comme plus favorables aux personnes disposant de revenus élevés, il est raisonnable d’anticiper une corrélation positive entre un haut niveau de richesse et un soutien aux partis de droite.

5.1 Recherche de correlation globale

Ensuite, nous avons cherché à analyser les corrélations entre nos données de vote et nos données socio-démographiques. Dans un premier temps, nous avons tenté de relier le nombre de votes aux autres variables. Cependant, nous nous sommes rapidement rendu compte que cette approche introduisait un biais : en utilisant le nombre de votes, nous observions systématiquement une corrélation avec les autres données. Cela s’explique par le fait que l’augmentation de la taille d’une commune entraîne mécaniquement une augmentation du nombre de ménages, d’habitants, et donc du nombre de votes.

Nous avons donc décidé de passer à l’analyse des proportions de voix afin d’éliminer ce biais lié à la taille des communes. En utilisant les proportions de votes exprimées pour chaque catégorie, nous avons pu observer les corrélations entre ces proportions et nos données socio-démographiques. Certaines variables se sont révélées particulièrement significatives, comme la proportion d’employés (part_employé) et celle d’ouvriers (part_ouvrier), qui présentaient des relations notables avec les résultats des votes.

##                        VarVote               VarDemo Correlation
## 176 pourcentage_voix_votant_eg         part_employes  -0.8246447
## 282  pourcentage_voix_votant_g     score_orientation  -0.8228443
## 285 pourcentage_voix_votant_ed     score_orientation   0.7716417
## 178  pourcentage_voix_votant_c         part_employes   0.7450642
## 181 pourcentage_voix_votant_eg         part_ouvriers   0.7430580
## 183  pourcentage_voix_votant_c         part_ouvriers  -0.5946924
## 280 pourcentage_voix_votant_ed        part_bac5_plus  -0.5599796
## 53   pourcentage_voix_votant_c part_non_peu_diplomes  -0.5566079
## 281 pourcentage_voix_votant_eg     score_orientation  -0.5517057
## 275 pourcentage_voix_votant_ed           part_bac3_4  -0.5310849
## # A tibble: 285 × 3
## # Groups:   VarDemo [57]
##    VarVote                    VarDemo          Correlation
##    <fct>                      <fct>                  <dbl>
##  1 pourcentage_voix_votant_g  population_ratio     -0.365 
##  2 pourcentage_voix_votant_ed population_ratio      0.287 
##  3 pourcentage_voix_votant_d  population_ratio      0.0790
##  4 pourcentage_voix_votant_c  population_ratio     -0.0749
##  5 pourcentage_voix_votant_eg population_ratio      0.0231
##  6 pourcentage_voix_votant_g  nb_25                 0.400 
##  7 pourcentage_voix_votant_ed nb_25                -0.313 
##  8 pourcentage_voix_votant_d  nb_25                -0.0572
##  9 pourcentage_voix_votant_eg nb_25                 0.0287
## 10 pourcentage_voix_votant_c  nb_25                 0.0142
## # ℹ 275 more rows

Nous avons également entrepris une analyse ciblée des variables démographiques en regroupant les données par type de variable. Cela nous a permis d’examiner les corrélations spécifiques entre chaque variable démographique et les proportions de votes. Pour ce faire, nous avons trié les corrélations au sein de chaque groupe démographique afin de mettre en évidence les relations les plus fortes et les plus significatives.

À ce stade, nous nous sommes interrogés sur la possibilité de modéliser nos données en utilisant un simple modèle de régression linéaire. L’objectif était de déterminer si une telle approche pouvait capter les tendances observées et expliquer les variations des proportions de voix en fonction des différentes variables socio-démographiques.

5.2 Richesse

N’ayant pas de données sur le niveau de vie en 2012, nous ne séléctionnerons pas de datas sur cette année. Voici le dataset que nous utiliserons:

code_bureau_vote votants non_exp voix_eg pourcentage_voix_votant_eg voix_g pourcentage_voix_votant_g voix_c pourcentage_voix_votant_c voix_d pourcentage_voix_votant_d voix_ed pourcentage_voix_votant_ed code_insee population_ratio libelle nb_25 nb_25_64 nb_65 prop_25 prop_25_64 prop_65 taux_nat taux_mort nb_non_scolarises part_non_peu_diplomes part_bepc_brevet part_cap_bep part_bac nb_h_total nb_f_total nb_h_15_24 nb_h_25_64 nb_h_65 nb_f_15_24 nb_f_25_64 nb_f_65 population_totale proportion_h proportion_f nb_emplois_lt taux_activite part_emplois_salaries part_agriculteurs part_emplois_non_salaries part_artisans part_commercants part_chefs_entreprise part_cadres part_prof_intermediaires part_employes part_ouvriers annees nb_menages nb_menages_pauvres nb_menages_seul nb_menages_5plus nb_menages_proprietaires nb_menages_monoparentaux niveau_vie_total surface_totale_logements nb_logements_collectifs nb_logements_maisons nb_log_avant_1945 nb_log_1945_1969 nb_log_1970_1989 nb_log_apres_1990 nb_log_date_inconnue nb_logements_sociaux part_bac2 part_bac3_4 part_bac5_plus score_orientation
862090002 170 5 1 0.5882353 53 31.17647 52 30.58824 44 25.882353 15 8.823529 86209 0.12898331 Roches-Prémarie-Andillé 76.74507 137.1093 42.04856 30.0 53.6 16.4 12.6 5.4 NA NA NA NA NA 77.77693 80.74355 15.22003 51.85129 10.70561 17.28376 52.75417 10.70561 158.5205 0.491 0.509 33.27769 80.2 78.6 8.5 21.4 5.1 8.1 25.0 32.1 21.1 96.9 52.4 2013-2017 104.183 3.650 28.893 9.088 83.552 7.408 6048638 13113.11 0.000 104.183 42.542 10.220 19.383 32.038 0 0.000 NA NA NA 0.53
561690004 634 24 10 1.5772871 158 24.92114 232 36.59306 38 5.993691 172 27.129338 56169 0.16268925 Plouhinec 186.27919 409.3261 275.43290 21.4 47.0 31.6 7.1 9.2 613.3385 15.0 5.4 30.8 19.3 237.20092 248.75186 40.50962 124.94534 71.74596 36.11701 141.05158 71.58327 485.9528 0.488 0.512 174.40287 72.0 75.2 5.1 24.8 13.3 22.6 8.3 20.6 30.0 93.0 47.7 2018-2022 386.689 47.702 122.842 14.444 277.545 45.850 19314071 40499.26 48.218 338.471 45.963 32.274 133.224 175.229 0 56.699 12.7 9.8 7.0 0.58
952190016 716 11 8 1.1173184 236 32.96089 259 36.17318 59 8.240223 143 19.972067 95219 0.05197068 Ermont 479.84525 780.4956 246.13312 31.9 51.8 16.3 16.0 6.9 1008.6988 18.9 4.4 18.1 16.7 454.43159 494.65689 87.62256 288.90499 77.95601 80.97031 313.79894 99.88764 949.0885 0.479 0.521 359.22131 77.2 87.1 0.0 12.9 5.5 31.9 19.4 31.9 11.3 90.6 66.5 2018-2022 421.253 23.639 126.802 35.844 324.803 44.174 32028557 35545.03 174.699 246.554 102.124 50.029 184.487 84.613 0 30.863 12.4 11.9 17.5 0.53

Observons rapidement la répartition vote droite/gauche en fonction de la richesse des habitants du secteur du bureau de vote :

On constate qu’effectivement le niveau de vie semble impacter le pourcentage de voix d’extrême gauche mais n’explique pas tout. Pour ce qui est de l’extrème droite, on observe une grande répartition donc le niveau de vie ne semble pas un facteur premier. Mais il y a tout de même cette tendance, ce qui laisse penser que la pauvreté pousse à voté dans les extrêmes.

Comparons maintenant avec notre score :

Nous cherchons une diagonale allant de l’angle inférieur gauche vers l’angle supérieur droit. Ce n’est pas le cas ici, ce qui indique que l’influence de la richesse sur les votes n’est pas significative lorsqu’elle est observée isolément. En revanche, notre théorie semble se confirmer : plus le niveau de richesse est faible, plus les votes tendent vers les extrêmes.

En conclusion, la richesse permet simplement d’expliquer qu’un niveau de vie bas est associé à une probabilité plus élevée de vote pour les extrêmes.

5.3 Khi-2

Nous avons ensuite tenté de réaliser des tests du Khi-2 afin d’examiner les relations entre nos données catégoriques et les proportions de votes. Pour cela, nous avons décidé de segmenter les données en quatre catégories, représentées par 4 colonnes et 4 lignes, pour simplifier l’analyse et réduire la complexité des relations à tester.

Malheureusement, cette approche s’est avérée encore moins concluante. Les résultats obtenus étaient chaotiques et incohérents, avec des p-valeurs élevées suggérant une absence de relation significative entre les variables étudiées.

L’un des principaux problèmes rencontrés résidait dans la distribution déséquilibrée des données au sein des catégories. Certaines cellules du tableau de contingence contenaient des effectifs trop faibles, voire nuls, ce qui a réduit considérablement la validité statistique du test du Khi-2. Cela a également généré des résultats peu fiables et difficilement généralisables.

À la lumière de ces difficultés, nous avons conclu que le test du Khi-2 n’était pas adapté à nos données dans leur état actuel.

5.4 Impact du nombre d’individu

Beaucoup de variable étant des quantités, il est intéressant de plutôt utiliser des proportions. Il faut également supprimer les colonnes inutiles car déjà représenté par d’autres (ex: Taux homme et Nb d’homme).

5.5 Recherche globale par visualisation poussée

Comme évoqué précédemment, il est pertinent de visualiser notre score en fonction de nos différentes variables explicatives. Nous allons donc les tester rapidement et observer les tendances qui en ressortent.

Cette matrice de graphiques de dispersion offre un bon aperçu des facteurs qui méritent d’être approfondies. On repère rapidement que le nombre de ménage propriétaire pousse un vote vers la droite. On voit aussi qu’un plus haut niveau d’étude pousse à voter à gauche.


6 Recherche de corrélations poussées

6.1 Regression liénaire

Le script est accessible en annexe.

Nous avons donc entrepris de modéliser les relations entre les variables les plus prometteuses à l’aide de régressions linéaires. Dans un premier temps, nous avons effectué des analyses unitaires et observé des résultats plutôt encourageants. Par exemple, la proportion de votes d’un groupe spécifique montrait une forte corrélation avec la part d’employés (part_employé), indiquant un lien significatif entre ces deux variables (schéma ci dessus).

Nous avons ensuite étendu cette approche à d’autres données, notamment celles relatives au travail plus généralement et à l’âge. Cependant, les résultats se sont avérés bien moins concluants. Les modèles de régression linéaire ne parvenaient pas à capturer efficacement les variations des proportions de votes en fonction de ces variables. Nous avons constaté que ces relations semblaient plus complexes et non linéaires, ce qui suggérait que des modèles plus sophistiqués pourraient être nécessaires pour mieux représenter ces interactions.

En outre, l’analyse visuelle des données a révélé une limitation supplémentaire : les points sur les graphiques présentaient une distribution resserrée autour du centre, avec peu de variabilité dans les extrêmes. Cette forme compressée rendait difficile l’identification de tendances claires et limitait la capacité de la régression linéaire à fournir des prédictions robustes.

Face à ces constats, nous avons conclu que la régression linéaire simple, bien qu’utile pour une première exploration, était insuffisante pour modéliser les liens complexes entre les variables socio-démographiques et les proportions de votes. Ces résultats ont souligné la nécessité d’envisager des approches plus avancées, telles que les régressions polynomiales, les modèles non linéaires ou encore des algorithmes d’apprentissage automatique, pour capturer des relations plus subtiles et non linéaires présentes dans les données.

6.2 Régression multiple

En ce qui concerne la régression multiple, nous avons consacré un certain temps pour tester différentes combinaisons de variables afin de trouver des modèles offrant des résultats satisfaisants. Nous avons exploré plusieurs approches, notamment les sélections backward et forward, en essayant différentes configurations et en ajustant les paramètres. Malgré nos efforts, les résultats obtenus n’ont pas été convaincants : aucun modèle ne semblait réellement capable de capturer de manière significative les liens complexes entre les variables démographiques et les proportions de votes.

6.3 Random forest

6.3.1 Entrainement

Le choix du modèle s’est orienté vers une random forest pour sa capacité à modéliser des interactions complexes entre les variables explicatives. L’implémentation ranger a été retenue en raison de ses performances optimisées, tant en termes de rapidité d’entraînement que de gestion de grandes quantités de données. L’objectif est de détecter des corrélations non linéaires qui pourraient influencer le vote de manière subtile et difficilement perceptible avec des modèles plus simples. Cette approche permet d’obtenir un bon équilibre entre le temps de calcul, la robustesse des prédictions et l’interprétabilité des résultats. Le script détaillé, incluant les paramètres d’entraînement et les étapes de prétraitement, est disponible en annexe pour une analyse complète et reproductible.

Le script est accessible en annexe.

Notre modèle affiche un R-squared de 0.6196, un RMSE de 0.0514 et un MAE de 0.0385, sur 71 013 observations et 43 variables explicatives. Cela signifie que les facteurs socio-démographiques expliquent environ 61 % de la variabilité du vote, ce qui traduit une bonne capacité à identifier des corrélations pertinentes entre les variables et le comportement électoral.

Cependant, cette performance doit être nuancée par la faible variance du score cible, ce qui limite l’amplitude des variations à expliquer. Les erreurs faibles (MAE et RMSE) indiquent une précision notable, mais environ 40 % de la variabilité reste inexpliquée, probablement en raison de facteurs non modélisés, comme des préférences individuelles ou des contextes locaux spécifiques.

6.4 Etude de la random forest

Nous commençons par identifier les variables significatives de notre modèle en utilisant le score d’importance basé sur l’impureté. Ce score correspond à la somme des réductions d’impureté réalisées par l’ensemble des arbres lorsqu’une variable est utilisée pour diviser un nœud. Bien que cette notion d’impureté puisse nous être peu familière, elle reste un indicateur fiable pour évaluer l’importance des variables. Nous obtenons ainsi :

##                                           Overall
## nb_logements_collectifs_prop_nb_menages  27.01208
## part_ouvriers                            26.95906
## part_employes                            25.93545
## nb_logements_maisons_prop_nb_menages     22.48439
## part_cap_bep                             20.89493
## surface_totale_logements_prop_nb_menages 19.49009
## prop_25                                  15.98144
## votants                                  15.40846
## nb_emplois_lt_prop_votants               14.87260
## part_emplois_non_salaries                14.10320
## part_emplois_salaries                    13.65021
##                                                                          variable
## nb_logements_collectifs_prop_nb_menages   nb_logements_collectifs_prop_nb_menages
## part_ouvriers                                                       part_ouvriers
## part_employes                                                       part_employes
## nb_logements_maisons_prop_nb_menages         nb_logements_maisons_prop_nb_menages
## part_cap_bep                                                         part_cap_bep
## surface_totale_logements_prop_nb_menages surface_totale_logements_prop_nb_menages
## prop_25                                                                   prop_25
## votants                                                                   votants
## nb_emplois_lt_prop_votants                             nb_emplois_lt_prop_votants
## part_emplois_non_salaries                               part_emplois_non_salaries
## part_emplois_salaries                                       part_emplois_salaries

On peut en conclure que des facteurs tels que la proportion de logements collectifs, de maisons et leur taille influencent l’orientation des votes au sein d’un bureau de vote. On observe également l’influence de facteurs liés à l’emploi, comme la proportion d’ouvriers et d’employés. Ces éléments seront décrits plus en détail lors de la synthèse.

Enfin, nous pouvons analyser des profils types et identifier les variables qui influencent ces profils. Pour cela, nous effectuons des prédictions à partir de notre modèle tout en catégorisant les observations afin d’examiner, pour chaque catégorie, les principales variables influentes. Nous utilisons la méthode de Shapley et les valeurs SHAP pour déterminer ces contributions. Voici les diagrammes correspondants :

> INTERPRETER
>

INTERPRETER

INTERPRETER

INTERPRETER

INTERPRETER


7 Synthèse


8 Annexe

8.1 Script de régression linéaire et résultat

# Fonction pour générer un graphique avec p-values et R-squared
generate_plot <- function(data, x_var, y_var, x_label, y_label, title) {
  # Modèle de régression
  model <- lm(as.formula(paste0(y_var, " ~ ", x_var)), data = data)
  model_summary <- summary(model)
  
  # Extraction des p-values, R-squared
  coef_pvalue <- signif(model_summary$coefficients[2, 4], 5) # P-value du coefficient
  fstat_pvalue <- signif(pf(
    model_summary$fstatistic[1],
    model_summary$fstatistic[2],
    model_summary$fstatistic[3],
    lower.tail = FALSE
  ), 5) # P-value de la F-statistic
  r_squared <- signif(model_summary$r.squared, 5) # R-squared
  
  # Génération du graphique
  ggplot(data, aes_string(x = x_var, y = y_var)) +
    geom_point() +
    geom_smooth(method = "lm", se = FALSE, color = "red") +
    labs(
      title = title,
      x = x_label,
      y = y_label
    ) +
    annotate(
      "text",
      x = max(data[[x_var]], na.rm = TRUE) * 0.8,
      y = max(data[[y_var]], na.rm = TRUE) * 0.8,
      label = paste0(
        "R² = ", r_squared,
        "\nP-val Coeff = ", coef_pvalue,
        "\nP-val F-Stat = ", fstat_pvalue
      ),
      hjust = 0,
      size = 4,
      color = "blue"
    )
}

# Liste des régressions à effectuer
regressions <- list(
  list(x = "part_employes", y = "pourcentage_voix_votant_eg", x_label = "Part des employés", y_label = "% Voix EG", title = "Régression linéaire : EG ~ part_employes"),
  list(x = "part_employes", y = "pourcentage_voix_votant_c", x_label = "Part des employés", y_label = "% Voix C", title = "Régression linéaire : C ~ part_employes")
  )

# Générer et afficher les graphiques
plots <- lapply(regressions, function(reg) {
  generate_plot(
    data = data,
    x_var = reg$x,
    y_var = reg$y,
    x_label = reg$x_label,
    y_label = reg$y_label,
    title = reg$title
  )
})

# Afficher les graphiques
for (p in plots) print(p)

8.2 Script d’entrainement random forest (via ranger, sur plusieurs coeurs)

# Préparation des données
df_model <- clean_data %>%
  group_by(code_bureau_vote) %>%
  slice_sample(n = 1) %>%
  ungroup() %>%
  select(where(is.numeric)) %>%
  select(-contains("voix")) %>%
  filter(!is.na(score_orientation))

write.csv(df_model, file = "big_score_training_data.csv", row.names = FALSE)

nzv <- nearZeroVar(df_model, saveMetrics = TRUE)
df_model <- df_model[, !nzv$nzv]

preProcValues <- preProcess(df_model, method = "medianImpute")
df_model <- predict(preProcValues, df_model)

num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)

train_ctrl <- trainControl(
  method        = "repeatedcv",
  number        = 5,
  repeats       = 3,
  verboseIter   = FALSE,
  allowParallel = TRUE
)

tune_grid <- expand.grid(
 mtry          = c(2, 4, 6, 8),
 splitrule     = c("variance", "extratrees"),
 min.node.size = c(5, 10, 15)
)

df_model <- as.data.frame(df_model)
X <- df_model[, setdiff(names(df_model), "score_orientation")]
Y <- df_model$score_orientation

set.seed(123)
rf_model <- train(
 x          = X,
 y          = Y,
 method     = "ranger",
 trControl  = train_ctrl,
 tuneGrid   = tune_grid,
 num.trees  = 500,
 importance = "impurity"
)

stopCluster(cl)
saveRDS(rf_model, file = "big_score_model.rds")

8.3 Script de merge spatiale (simplifié)

# Rendre les géométries valides avant l'intersection
bureau_vote_data <- st_make_valid(bureau_vote_data)
revenu_data <- st_make_valid(revenu_data)

# Intersection géographique entre les carreaux de 200m et les bureaux de vote
intersections <- st_intersection(revenu_data, bureau_vote_data)

# Calcul des aires et des proportions, run plusieurs heures (preparation MERGE)
intersections$area_intersection <- st_area(intersections)
intersections$area_carre <- st_area(revenu_data[match(intersections$id, revenu_data$id), ])
intersections$proportion <- as.numeric(intersections$area_intersection / intersections$area_carre)

# Calcul des indicateurs pondérés par les proportions d'intersection
resultats_final <- intersections[, .(
  nb_menages = round(sum(men * proportion, na.rm = TRUE), 3),
  nb_menages_pauvres = round(sum(men_pauv * proportion, na.rm = TRUE), 3),
  nb_logements_maisons = round(sum(men_mais * proportion, na.rm = TRUE), 3),
  niveau_vie_total = round(sum(ind_snv * proportion, na.rm = TRUE), 3)
), by = codebureauvote]

# Ajout de la géométrie correspondante au bureau de vote
resultats_final$geom <- bureau_vote_data$geom[match(resultats_final$codebureauvote, bureau_vote_data$codebureauvote)]
resultats_final <- st_as_sf(resultats_final, crs = 2154)

8.4 Code initialisation carte React avec MapLibre

// Initialisation de la carte
const map = new maplibregl.Map({
  container: mapContainerRef.current,
  style: {
    version: 8,
    sources: {
      "osm-tiles": {
        type: "raster",
        tiles: [
          "https://a.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png",
          "https://b.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png",
          "https://c.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png",
        ],
        tileSize: 256,
      },
      // On ajuste ici la source de la couche vectorielle en fonction de l'année
      political_map: {
        type: "vector",
        tiles: [
          `${tilesHostBaseURL}/data/${politicalMapSourceName}/{z}/{x}/{y}.pbf`,
        ],
      },
      "osm-tiles-labels": {
        type: "raster",
        tiles: [
          "https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png",
          "https://b.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png",
          "https://c.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png",
        ],
        tileSize: 256,
      },
    },
    layers: [
      {
        id: "osm-background",
        type: "raster",
        source: "osm-tiles",
      },
      {
        id: "political_map",
        type: "line",
        source: "political_map",
        "source-layer": "political_map",
        paint: {
          "line-color": "#e3cfd0",
          "line-width": [
            "interpolate",
            ["exponential", 1.5],
            ["zoom"],
            0,
            0.1,
            10,
            3,
          ],
        },
      },
      {
        id: "political_map_fill",
        type: "fill",
        source: "political_map",
        "source-layer": "political_map",
        paint: {
          "fill-color": [
            "interpolate",
            ["linear"],
            ["get", "score_orientation"],
            0,
            "#313695",
            0.25,
            "#4575b4",
            0.5,
            "#fdae61",
            0.75,
            "#d73027",
            1,
            "#a50026",
          ],
          "fill-opacity": 0.7,
          "fill-outline-color": [
            "interpolate",
            ["linear"],
            ["get", "score_orientation"],
            0,
            "#313695B3",
            0.25,
            "#4575b4B3",
            0.5,
            "#fdae61B3",
            0.75,
            "#d73027B3",
            1,
            "#a50026B3",
          ],
          "fill-antialias": true,
        },
      },
      {
        id: "osm-labels",
        type: "raster",
        source: "osm-tiles-labels",
      },
    ],
  },
  center: [2.2137, 46.2276],
  zoom: 5,
  maxZoom: 13,
  minZoom: 5,
});